Skip to content

fix: tty error#108

Merged
yjp20 merged 1 commit intonextfrom
youngjin/fix-tty
Feb 25, 2026
Merged

fix: tty error#108
yjp20 merged 1 commit intonextfrom
youngjin/fix-tty

Conversation

@yjp20
Copy link
Member

@yjp20 yjp20 commented Feb 20, 2026

I confirmed this works with claude code now, though still not super well. Hoping to improve that soon.

@yjp20 yjp20 changed the title Youngjin/fix tty fix: tty error Feb 20, 2026
@yjp20 yjp20 requested a review from bruce-hill February 20, 2026 11:31
Comment on lines +20 to +29
// Always output to stderr, in case we want to also output JSON so that the json is redirectable e.g. to jq.
opts = append(opts, tea.WithOutput(os.Stderr))

// If not a TTY, use stdin and disable renderer
if !term.IsTerminal(int(os.Stderr.Fd())) {
opts = append(opts,
tea.WithInput(os.Stdin),
tea.WithoutRenderer(),
)
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This logic is a bit suspicious to me. I think it would be helpful to expand on the comments here and/or rework the logic a bit.

Scenario 1: using the tool with no pipes -> output to stderr?
Scenario 2: using the tool and piping stdout somewhere -> output charm stuff to stderr?
Scenario 3: using the tool and piping stderr somewhere -> read from stdin, output charm stuff to stderr, and no charm rendering?

I would expect the logic to look more like:

if !isatty(stdout) { // stdout is being piped somewhere
  if isatty(stderr) { // stderr is still a tty, we can use that for TUI stuff
    // output = stderr
  } else { // no tty on either stdout/stderr, this would be the agent case
    // disable output, force stdin as input instead of tty input
  }
}

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure I fully understand, I think as the comment is saying I want the output to always be to stderr regardless of stdin piping status?

Copy link
Contributor

@bruce-hill bruce-hill Feb 25, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, I think your original logic checks out to me after looking at it harder for a bit.

One thing I want to check: How does this logic interact with the CLI tool's ability to pipe data in to stdin? You should be able to test pretty easily by doing something like stl cmd 2>&1 | cat and also cat /dev/stdin | stl cmd 2>&1 | cat. I'm slightly concerned that if you simulate being an LLM using the second command, it would read in the bubbletea prompts from stdin, then make the API request and try to read in a JSON object from stdin at that point, which would and either hang without a prompt or error.

Copy link
Member Author

@yjp20 yjp20 Feb 25, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry I need to merge this to support a customer before OOO, but very much intend to address this comment.

Copy link
Contributor

@bruce-hill bruce-hill Feb 25, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, all I'd ask is that you test cat | stl cmd 2>&1 | cat (simulate being an LLM by forcing stdin/stdout/stderr to be non-TTY) for some stl command that both uses tea and makes an API request, just to confirm that it doesn't hang or error.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I gave this a quick test and had to also type {}<ctrl-D> and it seems to work

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's what I'm worried about. Will that work with an LLM, or will that cause the LLM to not know how to proceed? It might be best to close stdin after gathering all the necessary user input and before making a request. Or somehow otherwise let the CLI know to not read request data from stdin in this scenario.

@yjp20 yjp20 merged commit e5409eb into next Feb 25, 2026
5 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants